package com.common.library.util;

import com.zs4sdk.common.Extra;
import com.zs4sdk.entity.Zs4GameData;

/**
 * 
 * function: 加密帮助
 * 
 * @ author: aXiBa
 */
public class EncryptHelper {
	
	/**
	 * 使用Base64方式对数据进行编码
	 * @param str
	 * @return
	 */
	public static String encodeByBase64(String str){
		if (Helper.isNotEmpty(str)){
			return encodeByBase64(str.getBytes());
		}
		return str;
	}
	
	/**
	 * AES加密,并用Base64编码
	 * @param content 待加密的内容
	 * @param key 加密密钥
	 * @param blockSize 分块加密大小
	 * @return 加密后的内容
	 */
	public static String encryptByAESWithBase64(String content, String key, int blockSize){
		try {
			return java.net.URLEncoder.encode(encodeByBase64(AES.encryptWithIV(content,key)),"utf-8");
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 使用Base64方式对数据进行编码
	 * @param data
	 * @return
	 */
	public static String encodeByBase64(byte[] data){
		return Base64.encode(data);
	}
	/**
	 * 使用Base64方式对字符串进行解码
	 * @param str
	 * @return
	 */
	public static byte[] decodeByBase64(String str){
		return Base64.decode(str);
	}
	/**
	 * 使用Base64方式对字符串进行解码
	 * @param str
	 * @return
	 */
	public static String decodeToStringByBase64(String str){
		return new String(Base64.decode(str));
	}
	/**
	 * 使用RC4进行加密(不设置密码则使用默认密码或最后一次修改的密码)
	 * @param string
	 * @return
	 */
	public static String encryptByRC4(String string){
		return RC4Encrypt.encrypt(string);
	}
	/**
	 * 使用RC4进行加密(不设置密码则使用默认密码或最后一次修改的密码)
	 * @param string
	 * @param password
	 * @return
	 */
	public static String encryptByRC4(String string, String password){
		if (Helper.isNotEmpty(password)){
			RC4Encrypt.setEncryptPassword(password);
		}
		return RC4Encrypt.encrypt(string);
	}
	/**
	 * 使用RC4进行解密(不设置密码则使用默认密码或最后一次修改的密码)
	 * @param string
	 * @return
	 */
	public static String decryptByRC4(String string){
		return RC4Encrypt.decrypt(string);
	}
	/**
	 * 使用RC4进行解密(不设置密码则使用默认密码或最后一次修改的密码)
	 * @param string
	 * @param password
	 * @return
	 */
	public static String decryptByRC4(String string, String password){
		if (Helper.isNotEmpty(password)){
			RC4Encrypt.setEncryptPassword(password);
		}
		return RC4Encrypt.decrypt(string);
	}

	/**
	 * MD5加密
	 * @param str
	 * @return
	 */
	public static String md5(String str){
		return MD5.md5(str).toLowerCase();
	}

	/**
	 * AES加密
	 * @param content
	 * @return
	 */
	public static final String encryptByAES(String content){
		return encryptByAESWithBase64(
				content
				, Zs4GameData.getInstance().getAppKey()
				, Extra.AES_ENCRYPT_BLOCK_SIZE
				);
	}
	
	/**
	 * AES加密
	 * @param content 待加密的内容
	 * @param key 加密密钥
	 * @return 加密后的内容
	 */
	public static byte[] encryptByAES(String content, String key){
		return AES.encrypt(content, key);
	}

	/**
	 * AES解密
	 * @param content 待解密的内容
	 * @param key 解密密钥
	 * @return 解密后的内容
	 */
	public static byte[] decryptByAES(byte[] content, String key){
		return AES.decrypt(content, key);
	}
	
	
	/**
	 * 加密密码
	 * @param password
	 * @return
	 */
	public static String encryptPassword(final String password){
		return encryptByRC4(password, Extra.PASSWORD);
	}
	/**
	 * 解密密码
	 * @param password
	 * @return
	 */
	public static String decryptPassword(final String password){
		return decryptByRC4(password, Extra.PASSWORD);
	}
}
